package com.qfedu.openplateform.gateway.filter;

import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.qfedu.openplateform.common.constans.ExceptionDict;
import com.qfedu.openplateform.common.entity.ResponseData;
import com.qfedu.openplateform.gateway.utils.Md5Util;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;

public class SignFilter implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 响应前检查签名

        // 获取请求参数
        Map<String, String[]> parameterMap = request.getParameterMap();
        // 用于存储 除了签名之前的数据
        Map<String,String> signMap = new HashMap<>();

        // 存储 签名之外 的数据
        for (String key:parameterMap.keySet()) {
            if (!"sign".equalsIgnoreCase(key)) {  // 排除 sign   得到 username=admin&password=admin&time=2021:03:18 19:52:50
                signMap.put(key, request.getParameter(key));//保存除了sign之外的数据
            }
        }

        String sign = request.getParameter("sign");// 获取 sign 签名数据

        // 将前端请求的 除了sign 参数组成map    "meiyoumima" 秘钥（盐）
        // 服务器签名   对所有参数组成的字符串进行签名    也有加秘钥
        String signServer = Md5Util.md5Signature(signMap,"meiyoumima");
        System.out.println("sign:"+sign+"--signServer:"+signServer);

        // 比较服务器 sign  和 前端传递的 sign
        if (signServer.equals(sign)){
            // 放行
            return true;
        }

        // 签名不对  拦截
        response.setContentType("application/json;charset=utf-8");
        ResponseData bean = new ResponseData();
        bean.setCode(ExceptionDict.SYSTEMPARAM_IDEMPOTENTS_ERROR);
        bean.setMessage("签名错误");
        try {
            response.getWriter().println(JSON.toJSONString(bean));
        } catch (JsonProcessingException ex) {
            ex.printStackTrace();
        }
        return false;
    }
}
